﻿using System;
using System.Collections.Generic;

using Flagwind.Data;

namespace Flagwind.ComponentModel
{
	/// <summary>
	/// 表示实现该接口的类型是一个查询参数类。
	/// </summary>
	/// <typeparam name="F">过滤条件枚举类型。</typeparam>
	/// <typeparam name="S">排序方式枚举类型。</typeparam>
	/// <typeparam name="I">附加成员枚举类型。</typeparam>
	public interface ISearchParameter<F, S, I> where F : struct 
											   where S : struct
											   where I : struct
	{
		#region 属性定义

		/// <summary>
		/// 获取查询条件。
		/// </summary>
		IReadOnlyList<Condition<F>> Conditions
		{
			get;
		}

		/// <summary>
		/// 获取排序规则。
		/// </summary>
		IReadOnlyList<Sorting<S>> Sortings
		{
			get;
		}

		/// <summary>
		/// 获取附加成员。
		/// </summary>
		IReadOnlyList<I> Includes
		{
			get;
		}

		/// <summary>
		/// 获取获设置查询条件的组合方式。
		/// </summary>
		ConditionCombination CombineMode
		{
			get;
			set;
		}

		#endregion

		#region 查询条件

		/// <summary>
		/// 添加一个查询条件。
		/// </summary>
		/// <param name="member">条件成员。</param>
		/// <param name="value">条件值。</param>
		void AddCondition(F member, object value);

		/// <summary>
		/// 添加一个查询条件。
		/// </summary>
		/// <param name="member">条件成员。</param>
		/// <param name="operation">操作符。</param>
		/// <param name="value">条件值。</param>
		void AddCondition(F member, ConditionOperator operation, object value);

		/// <summary>
		/// 移除一个查询成员。
		/// </summary>
		/// <param name="member">需要移除的查询成员。</param>
		void RemoveCondition(F member);

		/// <summary>
		/// 清空所有查询条件。
		/// </summary>
		void ClearCondition();

		/// <summary>
		/// 获取一个值，指示当前条件是否包含指定的条件成员。
		/// </summary>
		/// <param name="member">条件成员。</param>
		/// <returns>如果包含指定的条件成员，则为 true；否则为 false。</returns>
		bool ContainsCondition(F member);

		/// <summary>
		/// 合并查询条件。
		/// </summary>
		/// <returns>合并后的查询条件。</returns>
		ConditionCollection CombileCondition();

		#endregion

		#region 排序条件

		/// <summary>
		/// 添加一个排序成员。
		/// </summary>
		/// <param name="member">排序成员。</param>
		/// <param name="mode">排序方式。</param>
		void AddSorting(S member, SortingMode mode);

		/// <summary>
		/// 移除一个排序成员。
		/// </summary>
		/// <param name="member">需要移除的排序成员。</param>
		void RemoveSorting(S member);

		/// <summary>
		/// 清空所有排序成员。
		/// </summary>
		void ClearSorting();

		/// <summary>
		/// 获取一个值，指示当前条件是否包含指定的排序成员。
		/// </summary>
		/// <param name="member">排序成员。</param>
		/// <returns>如果包含指定的排序成员，则为 true；否则为 false。</returns>
		bool ContainsSorting(S member);

		/// <summary>
		/// 合并排序成员。
		/// </summary>
		/// <returns>合并后的排序成员。</returns>
		SortingCollection CombileSorting();

		#endregion

		#region 成员附加

		/// <summary>
		/// 添加一个附加成员。
		/// </summary>
		/// <param name="member">附加成员。</param>
		void AddInclude(I member);

		/// <summary>
		/// 移除一个附加成员。
		/// </summary>
		/// <param name="member">需要移除的附加成员。</param>
		void RemoveInclude(I member);

		/// <summary>
		/// 获取一个值，指示当前条件是否包含指定的附加成员。
		/// </summary>
		/// <param name="member">附加成员。</param>
		/// <returns>如果包含指定的附加成员，则为 true；否则为 false。</returns>
		bool ContainsInclude(I member);

		/// <summary>
		/// 合并包含成员。
		/// </summary>
		/// <returns>合并后的包含成员。</returns>
		IEnumerable<string> CombileInclude();

		#endregion
	}

	/// <summary>
	/// 表示实现该接口的类型是一个查询参数类。
	/// </summary>
	/// <typeparam name="C">过滤条件枚举类型。</typeparam>
	/// <typeparam name="S">排序方式枚举类型。</typeparam>
	public interface ISearchParameter<C, S> : ISearchParameter<C, S, EmptyEnum> where C : struct where S : struct
	{

	}
}
